package com.xu.GOF23.single;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class reflectBreak {
    private reflectBreak() {
        System.out.println("当前线程" + Thread.currentThread().getName() + "进入构造器创建对象");
    }

    private volatile static reflectBreak LazyManDead;

    public static reflectBreak getInstance() {
        if (LazyManDead == null) {//隔离除了第一次调用以外的调用，提高效率
            synchronized (reflectBreak.class) {
                if (LazyManDead == null) {
                    LazyManDead = new reflectBreak();
                }
            }
        }
        return LazyManDead;
    }

    public static void main(String[] args) throws Exception {
        reflectBreak lazyMan1 = reflectBreak.getInstance();//通过调用方法创建一个 懒汉1
        //通过反射创建
        Constructor<reflectBreak> declaredConstructor = reflectBreak.class.getDeclaredConstructor(null);//传入null 即得到一个空参构造器
        declaredConstructor.setAccessible(true);
        //setAccessible(true)这个是为了强行获得构造器的访问权限，比如说单例模式的类的构造器是私有的，你需要通过反射实例一个对象，就必须要有这一句，否则会引发非法访问权限异常
        reflectBreak lazyMan2 = declaredConstructor.newInstance();
        System.out.println(lazyMan1);
        System.out.println(lazyMan2);

    }
}
